home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -serious- / programming / e / lsestuff / old / newarray.e < prev   
Text File  |  1999-11-29  |  2KB  |  132 lines

  1. OPT MODULE
  2.  
  3. MODULE 'LeifOO/xl'
  4.  
  5. CONST VALUES=128
  6.  
  7. OBJECT xnode OF xni
  8.    values[VALUES]:ARRAY OF LONG
  9. ENDOBJECT
  10.  
  11.  
  12. EXPORT OBJECT newarray
  13.    PRIVATE
  14.    xlist:PTR TO xli
  15. ENDOBJECT
  16.  
  17. PROC newarray() OF newarray
  18.    NEW self.xlist
  19. ENDPROC
  20.  
  21. PROC end() OF newarray
  22.    self.clear()
  23.    END self.xlist
  24. ENDPROC
  25.  
  26. PROC set(x, value) OF newarray
  27.    DEF nodenum,
  28.        nodevaluenum,
  29.        xnode:PTR TO xnode
  30.  
  31.    nodenum := x / VALUES
  32.    nodevaluenum := x - (nodenum * VALUES)
  33.  
  34.    xnode := self.xlist.find(nodenum)
  35.  
  36.    IF xnode = NIL
  37.       xnode := AllocMem(SIZEOF xnode, NIL)
  38.       xnode.id := nodenum
  39.       self.xlist.addtail(xnode)
  40.    ENDIF
  41.  
  42.    setxnodeval(xnode, nodevaluenum, value)
  43. ENDPROC
  44.  
  45. PROC unset(x) OF newarray
  46.    DEF nodenum,
  47.        nodevaluenum,
  48.        xnode:PTR TO xnode
  49.  
  50.    nodenum := x / VALUES
  51.    nodevaluenum := x - (nodenum * VALUES)
  52.  
  53.    xnode := self.xlist.find(nodenum)
  54.  
  55.    IF xnode = NIL THEN RETURN NIL
  56.  
  57.    setxnodeval(xnode, nodevaluenum, NIL)
  58.  
  59.    IF xnodeisNIL(xnode)
  60.       self.xlist.remove(xnode)
  61.       FreeMem(xnode, SIZEOF xnode)
  62.    ENDIF
  63. ENDPROC
  64.  
  65. PROC get(x) OF newarray
  66.    DEF nodenum,
  67.    nodevaluenum,
  68.    xnode:PTR TO xnode
  69.  
  70.    nodenum := x / VALUES
  71.    nodevaluenum := x - (nodenum * VALUES)
  72.  
  73.    xnode := self.xlist.find(nodenum)
  74.  
  75.    IF xnode <> NIL
  76.       RETURN getxnodeval(xnode, nodevaluenum)
  77.    ENDIF
  78. ENDPROC NIL
  79.  
  80. PROC count() OF newarray
  81.    DEF xnode:PTR TO xnode, c=NIL, a, stop
  82.    xnode:=self.xlist.first()
  83.    stop:=VALUES
  84.    stop--
  85.       WHILE xnode
  86.          FOR a:=0 TO stop
  87.             IF getxnodeval(xnode, a) THEN c++
  88.          ENDFOR
  89.          xnode:=xnode.next
  90.       ENDWHILE
  91. ENDPROC c
  92.  
  93. PROC clear() OF newarray
  94.    freememall(self.xlist, SIZEOF xnode)
  95. ENDPROC
  96.  
  97. PROC freememall(xl:PTR TO xl, nodesize)
  98.    DEF xn:PTR TO xn
  99.    xn:=xl.first()
  100.    WHILE xn
  101.       xl.remove(xn)
  102.       FreeMem(xn, nodesize)
  103.       xn:=xn.next
  104.    ENDWHILE
  105. ENDPROC
  106.  
  107.  
  108. PROC xnodeisNIL(xnode:PTR TO xnode)
  109.    DEF a:REG, ptr:REG PTR TO LONG, stop:REG
  110.    stop := VALUES
  111.    stop--
  112.    ptr := xnode.values
  113.    FOR a := 0 TO stop
  114.       IF ptr[a] <> NIL THEN RETURN FALSE
  115.    ENDFOR
  116. ENDPROC TRUE
  117.  
  118. PROC getxnodeval(xnode:PTR TO xnode, valuenum)
  119.    DEF ptr:PTR TO LONG, value
  120.    ptr := (xnode.values) + (valuenum * 4)
  121.    value := ptr[]
  122. ENDPROC value
  123.  
  124. PROC setxnodeval(xnode:PTR TO xnode, valuenum, value)
  125.    DEF ptr:PTR TO LONG
  126.    ptr := (xnode.values) + (valuenum * 4)
  127.    ptr[] := value
  128. ENDPROC
  129.  
  130.  
  131.  
  132.